Практические советы (How to) ...

Как выборочно запретить редактирование полей в представлении?

В представлении Update (Изменение или Редактирование), по-умолчанию, все поля (за исключением ключа (key) - имеется в виду поле, соответствующее primary key-столбцам из таблицы базы данных) доступны для изменения.
Запретить редактирование конкретных полей можно, определив аттрибут read-only для соответствующих данному полю свойства представления, например, таким способом:
<view name="SomeMemberReadOnly">
    <property-view property="name" read-only="true"/>
</view>
 
Или, если вы работает с OpenXava 3, можно использовать аннотации:
@ReadOnly(forViews="SomeMembersReadOnly")
private String name;
 

Можно ли использовать разные представления для вставки и редактирования?

Для этого вам необходимо определить разные представления для вставки и редактирования, например, вот так:
<component ... >
    ...
    <view name="Create">
        ...
    </view>
 
    <view name="Update">
        ...
    </view>
 
</component>
 
Или, если вы работает с OX3, можно использовать аннотации:
@Views({
    @View(name="Create", members=" .... "),
    @View(name="Update", members=" ... ")
})
public class MyEntity { ...
 
Теперь вам необходимо добавить (refine) новое действие (action) для того, чтобы выбирать представление Create (Создание), и поисковое действие (the searching action) для выбора представления Update (Изменение). Для начала, определите новый контроллер в файле controllers.xml, пример ниже:
<controller name="MyTypical">
    <action name="new"
        class="com.mycompany.myapplication.actions.MyNewAction"
        image="images/new.gif" on-init="true"
        keystroke="F2">
        <use-object name="xava_view"/>  <!-- Not needed since v4m2-->
    </action>
    <action name="search"
        by-default="if-possible" hidden="true"
        class="com.mycompany.myapplication.actions.MySearchAction"
        keystroke="F8">
        <use-object name="xava_view"/>  <!-- Not needed since v4m2-->
    </action>
</controller>
А теперь поставьте ваш контоллер в соответствие вашему модулю и определить действие по поиску (the searching action) для модуля. Создайте ваш модуль в application.xml следующим образом:
<module name="MyModule">
    <env-var name="XAVA_SEARCH_ACTION" value="MyTypical.search"/>
    <model name="MyComponent"/>
    <controller name="MyTypical"/>
</module>
 
Теперь лишь остаётся определить логику для действий (actions). Для MySearchAction вы напишите (ЗАМЕЧАНИЕ: т.к. метод setViewName(...) (метка 2 на иллюстрации ниже) производит сброс (reset) внутренних данных, то до его выполнения необходимо сохранить данные "selected entity index values" (метка 1 на иллюстации ниже), а после его выполнения данные необходимо восстановить (метка 3 на иллюстрации)):
public class MySearchAction extends SearchByViewKeyAction {
 
    public void execute() throws Exception {
        Map mapIndexValues = getView().getKeyValuesWithValue(); //1
        getView().setViewName("Update"); //2
        getView().setValues(mapIndexValues); //3
        super.execute();
    }
}
И для MyNewAction:
public class MyNewAction extends NewAction {
 
    public void execute() throws Exception {
        getView().setViewName("Create");
        super.execute();
    }
}
 

Как деактивировать свойство только для редактирования, но не для создания?

Вам нужно создать новое действие action and the searching action. Сначала определите контоллер в файле your controllers.xml, например вот так:
<controller name="MyTypical">
    <action name="new"
        class="com.mycompany.myapplication.actions.MyNewAction"
        image="images/new.gif" on-init="true"
        keystroke="F2">
        <use-object name="xava_view"/>  <!-- Not needed since v4m2-->
    </action>
    <action name="search"
        by-default="if-possible" hidden="true"
        class="com.mycompany.myapplication.actions.MySearchAction"
        keystroke="F8">
        <use-object name="xava_view"/>  <!-- Not needed since v4m2-->
    </action>
</controller>
А теперь настало время привязать контроллер к нашему модулю, определив поисковое действие (the searching action) для модуля for the module. Это реализуется внесением следующего текста в application.xml:
<module name="MyModule">
    <env-var name="XAVA_SEARCH_ACTION" value="MyTypical.search"/>
    <model name="MyComponent"/>
    <controller name="MyTypical"/>
</module>
 
Теперь остается только определить логику для Действий (actions). Для MySearchAction вы напишите:
public class MySearchAction extends SearchByViewKeyAction {
 
    public void execute() throws Exception {
        super.execute();
        getView().setEditable("myproperty", false);
    }
}
И для MyNewAction:
public class MyNewAction extends NewAction {
 
    public void execute() throws Exception {
        super.execute();
        getView().setEditable("myproperty", true);
    }
}
 

Как обратиться к свойству Модели, которые не отображаются в Представлении?

Из Представления вы можете обращаться только к отображаемым данным. Тем не менее, возможно обратиться напрямую к Модели, используя класс MapFacade.
Вы можете это сделать, написав примерно такой код:
public class MyAction extends ViewBaseAction {
 
    public void execute() throws Exception {
        Invoice invoice = (Invoice) MapFacade.findEntity(getModelName(), getView().getKeyValues());
        // Special discount is not shown in the view
        BigDecimal specialDiscount = invoice.getSpecialDiscount();
        ...
    }
    ...
 
В примере, показанном на иллюстрации выше, показано на примере свойства specialDiscount класса Invoice, как это реализовать.

Как сохранить предпочтения пользователя (Новое, начиная с v3.0.2)?

Сохранение пользовательских предпочтений обычно реализуется сами приложением, но можно использовать встроенную функциональность OpenXava.
OpenXava использует Java Preferences API для сохранения и загрузки предпочтений, но адаптированный для работы с мультипользовательском серверном окружении. Вы можете обращаться к объекту Preferences, используя класс Users OpenXava. Примерно таким образом:
 // Obtain preferences for the current user
 // and node (an arbitrary category of your choice)
 Preferences preferences = Users.getCurrentPreferences().node("mynode");
 
 // Read a property value
 boolean rowsHidden = preferences.getBoolean(ROWS_HIDDEN, false);
 
 ...
 
 // Modify and save a property
 preferences.putBoolean(ROWS_HIDDEN, rowsHidden);
 preferences.flush();
Вам необходимо явно вызвать метод flush() , чтобы сохранить изменившиеся предпочтения пользователя.